package core;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class Hierarquia {

	public HashMap<String,String>[] niveisHierarquia;
	int nivelHierarquicoActual;
	
	public Hierarquia(int numNiveis){
		niveisHierarquia = new HashMap[numNiveis];
		for(int i=0; i<numNiveis; i++){
			niveisHierarquia[i] = new HashMap<String, String>();
		}
	}
	
	public void init(String type){
		if(type.equals("default")){
			niveisHierarquia[0].put("19", "-1");
			niveisHierarquia[0].put("0", "-1");
			
			niveisHierarquia[1].put("14", "19");
			niveisHierarquia[1].put("15", "19");
			niveisHierarquia[1].put("16", "19");
			niveisHierarquia[1].put("17", "19");
			niveisHierarquia[1].put("18", "19");
			
			niveisHierarquia[2].put("1", "14");
			niveisHierarquia[2].put("2", "14");
			niveisHierarquia[2].put("3", "14");
			niveisHierarquia[2].put("4", "15");
			niveisHierarquia[2].put("5", "15");
			niveisHierarquia[2].put("6", "15");
			niveisHierarquia[2].put("7", "15");
			niveisHierarquia[2].put("8", "16");
			niveisHierarquia[2].put("9", "16");
			niveisHierarquia[2].put("10", "16");
			niveisHierarquia[2].put("11", "17");
			niveisHierarquia[2].put("12", "17");
		}
		if(type.equals("flat")){
			niveisHierarquia[0].put("19", "-1");
			niveisHierarquia[0].put("0", "-1");
			niveisHierarquia[0].put("14", "-1");
			niveisHierarquia[0].put("15", "-1");
			niveisHierarquia[0].put("16", "-1");
			niveisHierarquia[0].put("17", "-1");
			niveisHierarquia[0].put("18", "-1");
			niveisHierarquia[0].put("1", "-1");
			niveisHierarquia[0].put("2", "-1");
			niveisHierarquia[0].put("3", "-1");
			niveisHierarquia[0].put("4", "-1");
			niveisHierarquia[0].put("5", "-1");
			niveisHierarquia[0].put("6", "-1");
			niveisHierarquia[0].put("7", "-1");
			niveisHierarquia[0].put("8", "-1");
			niveisHierarquia[0].put("9", "-1");
			niveisHierarquia[0].put("10", "-1");
			niveisHierarquia[0].put("11", "-1");
			niveisHierarquia[0].put("12", "-1");
		}
	}
	
	public void reduzHierarquiaNivel(Corpus corpus, Integer nivelDesejado){
		
		for(int i=0; i<corpus.listaDocumentos.length;i++){
			for(int j=0; j<corpus.listaDocumentos[i].sentenceList.length; j++){
				corpus.listaDocumentos[i].sentenceList[j].categoriaTemp = new String(corpus.listaDocumentos[i].sentenceList[j].categoriaReal);
			}
		}
				
		for(int i=niveisHierarquia.length-1; i>nivelDesejado; i--){
			
			Set<Map.Entry<String,String>> nivelHierarquico = niveisHierarquia[i].entrySet();
			Iterator<Map.Entry<String,String>> it = nivelHierarquico.iterator();
			while(it.hasNext()){
				Map.Entry<String,String> me = (Map.Entry<String,String>)it.next();
				
				//percorre o corpus e substitui
				for(int a=0; a<corpus.listaDocumentos.length; a++){
					for(int b=0; b<corpus.listaDocumentos[a].sentenceList.length; b++){
						if(corpus.listaDocumentos[a].sentenceList[b].categoriaReal.equals(me.getKey()) ||
								corpus.listaDocumentos[a].sentenceList[b].categoriaTemp.equals(me.getKey())){
							corpus.listaDocumentos[a].sentenceList[b].categoriaTemp = new String(me.getValue());
						}						
					}
				}
			}
		}
		nivelHierarquicoActual=nivelDesejado;
	}
	
	public ArrayList<String> devolveLabelsHierarquia(){
		
		int nivelActual = nivelHierarquicoActual;
		ArrayList<String> listaLabels = new ArrayList<String>();
		
		for(int i=nivelActual; i>=0; i--){
			Set<Map.Entry<String,String>> nivelHierarquico = niveisHierarquia[i].entrySet();
			Iterator<Map.Entry<String,String>> it = nivelHierarquico.iterator();
			while(it.hasNext()){
				Map.Entry<String,String> me = (Map.Entry<String,String>)it.next();
				listaLabels.add(me.getKey());
			}
		}
		return listaLabels;
	}
		
	public Boolean serDescendente(String filho, String possivelPai){
		
		if(filho.equals(possivelPai))
			return true;
		
		for(int i=niveisHierarquia.length-1; i>-1; i--){
			Set<Map.Entry<String,String>> nivelHierarquico = niveisHierarquia[i].entrySet();
			Iterator<Map.Entry<String,String>> it = nivelHierarquico.iterator();
			while(it.hasNext()){
				Map.Entry<String,String> me = (Map.Entry<String,String>)it.next();
				if(me.getKey().equals(filho)){
					if(me.getValue().equals(possivelPai)){
						return true;
					}else{
						filho = me.getValue();
					}
				}
			}
		}
		return false;
	}

}
